Python列表不反映变量

Fle*_*515 19 python variables list

当我写这段代码时:

polly = "alive"
palin = ["parrot", polly]
print(palin)
polly = "dead"
print(palin)
Run Code Online (Sandbox Code Playgroud)

我以为它会输出这个:

"['parrot', 'alive']"
"['parrot', 'dead']"
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.如何输出它?

Mar*_*ers 48

Python变量包含对值的引用.因此,在定义palin列表时,传入引用的值polly,而不是变量本身.

您应该将值想象为气球,变量是与这些气球相关联的线程."alive"是一个气球,polly只是该气球的一个线程,该palin列表有一个不同的线程绑定到同一个气球.在python中,列表只是一系列线程,所有线程都从0开始编号.

你接下来要做的是将polly字符串绑定到一个新的气球"dead",但列表仍然保持与"alive"气球相关的旧线程.

您可以"alive"通过索引重新分配列表来替换列表中保存的线程以引用每个线程; 在你的例子中的线程1:

>>> palin[1] = polly
>>> palin
['parrot', 'dead']
Run Code Online (Sandbox Code Playgroud)

在这里,我简单地将palin[1]线程polly绑定到同一个东西上,无论可能是什么.

请注意,在任何蟒集合,如dict,set,tuple,等仅仅是线程的集合了.其中一些可以将它们的线程换成不同的线程,例如列表和dicts,这就是使python中的某些内容"可变"的原因.

另一方面,字符串不可变.一旦你定义了一个像"dead"或的字符串"alive",它就是一个气球.你可以用线程(变量,列表或其他)绑定它,但你不能替换它内部的字母.您只能将该线程绑定到一个全新的字符串.

python中的大多数东西都可以像气球一样.整数,字符串,列表,函数,实例,类都可以绑定到变量,或绑定到容器中.

您可能也想阅读Ned Batchelder关于Python名称的论文.

  • 我喜欢气球比喻 - 特别是如果它们是氦气球,当最后一根弦被释放时会飘走......(+ 1). (11认同)
  • @DSM:完全正确:-) GC是吹掉任何没有束缚的气球的风.:-) (8认同)
  • 这是否意味着垃圾收集策略与天气相对应? (4认同)

Mar*_*eed 5

当您将字符串放入列表中时,列表将保存该字符串的副本。字符串最初是变量,字面值,函数调用的结果还是其他无关紧要;当列表看到它时,它只是一个字符串值。以后更改生成的字符串将永远不会影响列表。

如果要存储对值的引用,该引用将在该值更改时注意到,通常的机制是使用包含“被引用”值的列表。将其应用于您的示例,最后得到一个嵌套列表。例:

polly = ["alive"]
palin = ["parrot", polly]
print(palin)
polly[0] = "dead"
print(palin)
Run Code Online (Sandbox Code Playgroud)