Nếu bạn đến với Python từ một ngôn ngữ trong C / Java / etc. gia đình, nó có thể giúp bạn ngừng suy nghĩ a
như một "biến số" và bắt đầu nghĩ về nó như một "cái tên".
a
, b
Vàc
không có các biến khác nhau có giá trị bằng nhau; chúng là những tên khác nhau cho cùng một giá trị. Các biến có các loại, danh tính, địa chỉ và tất cả các loại công cụ như thế.
Tên không có bất kỳ điều đó. Tất nhiên, các giá trị và bạn có thể có rất nhiều tên cho cùng một giá trị.
Nếu bạn cho Notorious B.I.G.
một con chó nóng, * Biggie Smalls
và Chris Wallace
có một con chó nóng. Nếu bạn thay đổi phần tử đầu tiên a
thành 1, các phần tử đầu tiên của b
và c
là 1.
Nếu bạn muốn biết nếu hai tên được đặt tên cùng một đối tượng, hãy sử dụng is
toán tử:
>>> a=b=c=[0,3,5]
>>> a is b
True
Sau đó bạn hỏi:
Có gì khác với cái này?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Ở đây, bạn đang đảo ngược tên e
thành giá trị 4
. Điều đó không ảnh hưởng đến tên d
vàf
theo bất kỳ cách nào.
Trong phiên bản trước của bạn, bạn đã được chỉ định a[0]
, không phải a
. Vì vậy, từ quan điểm của a[0]
, bạn đang phản xạ a[0]
, nhưng từ quan điểm của a
, bạn đang thay đổi nó tại chỗ.
Bạn có thể sử dụng id
hàm, cung cấp cho bạn một số số duy nhất đại diện cho danh tính của một đối tượng, để xem chính xác đối tượng đó là gì ngay cả khi is
không thể giúp đỡ:
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
Lưu ý rằng a[0]
đã thay đổi từ 4297261120 thành 4297261216, giờ đây nó là một tên cho một giá trị khác. Và b[0]
bây giờ cũng là một tên cho cùng một giá trị mới. Đó là bởi vì a
và b
vẫn đang đặt tên cho cùng một đối tượng.
Dưới vỏ bọc, a[0]=1
thực sự đang gọi một phương thức trên đối tượng danh sách. (Nó tương đương với a.__setitem__(0, 1)
.) Vì vậy, nó không thực sự phản đối bất cứ điều gì cả. Nó giống như gọi điện thoại my_object.set_something(1)
. Chắc chắn, có khả năng đối tượng đang đóng lại một thuộc tính thể hiện để thực hiện phương thức này, nhưng đó không phải là điều quan trọng; Điều quan trọng là bạn không chỉ định bất cứ điều gì, bạn chỉ đang biến đổi đối tượng. Và nó cũng tương tự với a[0]=1
.
người dùng570826 hỏi:
Nếu chúng ta có, a = b = c = 10
Đó chính xác là tình huống tương tự như a = b = c = [1, 2, 3]
: bạn có ba tên cho cùng một giá trị.
Nhưng trong trường hợp này, giá trị là một int
và int
s là bất biến. Trong cả hai trường hợp, bạn có thể đặt lại a
thành một giá trị khác (ví dụ a = "Now I'm a string!"
:), nhưng sẽ không ảnh hưởng đến giá trị ban đầu, b
và c
vẫn sẽ là tên cho. Sự khác biệt là với một danh sách, bạn có thể thay đổi giá trị [1, 2, 3]
thành [1, 2, 3, 4]
bằng cách thực hiện, ví dụ : a.append(4)
; vì đó thực sự thay đổi giá trị b
và c
là tên cho, b
bây giờ sẽ b [1, 2, 3, 4]
. Không có cách nào để thay đổi giá trị 10
thành bất cứ điều gì khác. 10
là 10 mãi mãi, giống như Claudia, ma cà rồng là 5 mãi mãi (ít nhất là cho đến khi cô được thay thế bởi Kirsten Dunst).
* Cảnh báo: Đừng cho Hot dog Notorious BIG. Gangsta rap zombie không bao giờ nên được cho ăn sau nửa đêm.
a
,b
vàc,
cho tất cả các điểm đến cùng giá trị (trong trường hợp này một danh sách), hay bạn muốna=0
,b=3
vàc=5
. Trong trường hợp đó, bạn muốna,b,c = [0,3,5]
hoặc chỉa,b,c = 0,3,5
.