【发布时间】:2020-08-05 03:22:01
【问题描述】:
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”不包含在字符串中是有意义的吗?
我认为索引会返回带有字符串的“容器”,然后附加“z”会改变存储的字符串。显然制作了一个独特的“容器”,但我不明白如何或为什么。
(如果附加到字符串会生成一个新字符串,我不知道为什么我测试过的整数也会发生相同的行为......使用浮点数会产生不同的结果吗?)
【问题讨论】:
-
@deadshot 没有,因为它没有回答为什么
letters = item[0]和bar = foo的行为不同——一个修改它派生的变量,另一个不修改。为什么容器被指向相同的一个而不是另一个?item[0]会在内存中创建一个新位置吗?为什么他们会这样做而不是bar = foo? -
@financial_physician 你真的应该阅读以下内容:nedbatchelder.com/text/names.html。在任何情况下,这些赋值语句的行为都没有不同。但是,在一种情况下,您正在改变一个列表,在另一种情况下,您正在创建一个新字符串(这是
+运算符对 stings 所做的)。 -
@juanpa.arrivillaga 这是一篇好文章。我认为它解释了 AerysS 的文章。关于可变对象与不可变对象的快速段落是我在知识上的差距所在。两篇文章都明确区分。