什么决定变量是否会被改变?
What determines if the variable will be altered or not?
class MyClass:
def __init__(self, a):
self.a = a
def append(some_list):
some_list.append(["d"])
foo =[["a"],["b"],["c"]]
bar = foo
my_class = MyClass(foo)
append(bar)
for item in bar:
item[0] += "x"
letters = item[0]
letters += "z"
print (my_class.a)
产生输出
[['ax'], ['bx'], ['cx'], ['dx']]
示例中发生了很多事情,我对所有这些感觉都很好,除了我希望“z”也被标记到字符串上,但事实并非如此。
有人可以解释为什么字符串中不包含“z”是有意义的吗?
我认为索引会 return 带有字符串的“容器”,然后附加“z”会改变存储的字符串。显然是制作了一个独特的“容器”,但我不明白如何或为什么。
(如果附加到字符串生成一个新字符串,我不知道为什么同样的行为也会发生在我测试过的整数上...使用浮点数会有不同的结果吗?)
这是因为可变对象。例如
>>>l1 = [1,2,3]
>>>l2 = l1
>>>l2[0]=4
>>>print(l1[0])
4
在例子中,l1
和l2
指向相同的内存位置。要创建 l1
作为 l2
的副本,请使用 copy()
:
>>>l1 = [1,2,3]
>>>l2 = l1.copy()
>>>l2[0]=4
>>>print(l1[0])
1
>>>print(l2[0])
4
编辑:根据评论建议更改解释。
在您的示例中,foo
和 bar
指向相同的内存位置:您在 foo
中更改的内容也会在 bar
中更改。为什么它不附加“z”是因为 letters
是一个声明的变量,其值为 item[0]
,但它没有发生变化。
如果你 print(letters)
它将打印 "dz"
.
class MyClass:
def __init__(self, a):
self.a = a
def append(some_list):
some_list.append(["d"])
foo =[["a"],["b"],["c"]]
bar = foo
my_class = MyClass(foo)
append(bar)
for item in bar:
item[0] += "x"
letters = item[0]
letters += "z"
print (my_class.a)
产生输出
[['ax'], ['bx'], ['cx'], ['dx']]
示例中发生了很多事情,我对所有这些感觉都很好,除了我希望“z”也被标记到字符串上,但事实并非如此。
有人可以解释为什么字符串中不包含“z”是有意义的吗?
我认为索引会 return 带有字符串的“容器”,然后附加“z”会改变存储的字符串。显然是制作了一个独特的“容器”,但我不明白如何或为什么。
(如果附加到字符串生成一个新字符串,我不知道为什么同样的行为也会发生在我测试过的整数上...使用浮点数会有不同的结果吗?)
这是因为可变对象。例如
>>>l1 = [1,2,3]
>>>l2 = l1
>>>l2[0]=4
>>>print(l1[0])
4
在例子中,l1
和l2
指向相同的内存位置。要创建 l1
作为 l2
的副本,请使用 copy()
:
>>>l1 = [1,2,3]
>>>l2 = l1.copy()
>>>l2[0]=4
>>>print(l1[0])
1
>>>print(l2[0])
4
编辑:根据评论建议更改解释。
在您的示例中,foo
和 bar
指向相同的内存位置:您在 foo
中更改的内容也会在 bar
中更改。为什么它不附加“z”是因为 letters
是一个声明的变量,其值为 item[0]
,但它没有发生变化。
如果你 print(letters)
它将打印 "dz"
.