Về cơ bản, b = a
điểm b
đến bất cứ nơi nào a
điểm và không có gì khác.
Điều bạn đang hỏi là các loại có thể thay đổi. Số, chuỗi, tuples, frozensets, booleans, None
, là không thay đổi. Danh sách, từ điển, bộ, bytearrays, là mutable.
Nếu tôi thực hiện một loại có thể thay đổi, giống như một list
:
>>> a = [1, 2] # create an object in memory that points to 1 and 2, and point a at it
>>> b = a # point b to wherever a points
>>> a[0] = 2 # change the object that a points to by pointing its first item at 2
>>> a
[2, 2]
>>> b
[2, 2]
Họ sẽ cả hai vẫn trỏ đến cùng một mục.
tôi sẽ bình luận về mã ban đầu của bạn quá:
>>>a=5 # '5' is interned, so it already exists, point a at it in memory
>>>b=a # point b to wherever a points
>>>a=6 # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
Bạn luôn có thể nhìn thấy nơi một cái gì đó điểm đến trong bộ nhớ bằng cách làm id(something)
.
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368 # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368 # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356 # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368 # still pointing at 5.
>>> b
5
Bạn sử dụng copy
khi bạn muốn tạo bản sao của cấu trúc. Tuy nhiên, nó vẫn sẽ không tạo bản sao của nội dung nào đó là interned. Số này bao gồm các số nguyên nhỏ hơn 256
, True
, False
, None
, các chuỗi ngắn như a
. Về cơ bản, bạn nên gần như không bao giờ sử dụng nó trừ khi bạn chắc chắn rằng bạn sẽ không bị rối tung lên bởi interning.
Hãy xem xét một ví dụ nữa, cho thấy ngay cả với loại có thể thay đổi, chỉ một biến tại một cái gì đó mới vẫn không thay đổi biến cũ:
>>> a = [1, 2]
>>> b = a
>>> a = a[:1] # copy the list a points to, starting with item 2, and point a at it
>>> b # b still points to the original list
[1, 2]
>>> a
[1]
>>> id(b)
79367984
>>> id(a)
80533904
Slicing một danh sách (bất cứ khi nào bạn sử dụng một :
) làm cho một sao chép.
Chuyển nhượng bằng Python * không bao giờ * giá trị bản sao. –