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ĩ anhư một "biến số" và bắt đầu nghĩ về nó như một "cái tên".
a, bVà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 Smallsvà Chris Wallacecó một con chó nóng. Nếu bạn thay đổi phần tử đầu tiên athành 1, các phần tử đầu tiên của bvà clà 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 istoá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 ethành giá trị 4. Điều đó không ảnh hưởng đến tên dvà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 idhà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 iskhô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ì avà bvẫn đang đặt tên cho cùng một đối tượng.
Dưới vỏ bọc, a[0]=1thự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 intvà ints là bất biến. Trong cả hai trường hợp, bạn có thể đặt lại athà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, bvà cvẫ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ị bvà clà tên cho, bbây giờ sẽ b [1, 2, 3, 4]. Không có cách nào để thay đổi giá trị 10thành bất cứ điều gì khác. 10là 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,bvà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=3và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.