Python列表不反映变量chang

2024-04-29 20:02:58 发布

您现在位置:Python中文网/ 问答频道 /正文

当我写这段代码时:

polly = "alive"
palin = ["parrot", polly]
print(palin)
polly = "dead"
print(palin)

我想它会输出这个:

"['parrot', 'alive']"
"['parrot', 'dead']"

但是,它没有。我如何让它输出?


Tags: 代码parrotprintdeadalivepollypalin
3条回答

在第二个print语句之前,将新值存储到palin

palin = ["parrot", polly]

当您将字符串放入列表中时,该列表将保存该字符串的副本。不管字符串最初是变量、文本值、函数调用的结果还是其他什么;当列表看到它时,它只是一个字符串值。更改稍后生成的字符串不会影响列表。

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

polly = ["alive"]
palin = ["parrot", polly]
print(palin)
polly[0] = "dead"
print(palin)

Python变量保存对的引用。因此,当您定义palin列表时,您将传入由polly引用的值,而不是变量本身。

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

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

您可以将该线程替换为列表中的"alive",方法是按索引重新分配列表以引用每个线程;在您的示例中,即线程1

>>> palin[1] = polly
>>> palin
['parrot', 'dead']

在这里,我只是将palin[1]线程绑定到polly绑定到的同一个对象上,不管是什么。

请注意,python中的任何集合,例如dictsettuple等,也只是线程的集合。其中一些线程可以换成不同的线程,比如列表和dict,这就是python中的“可变”的原因。

另一方面,字符串是不可变的。一旦定义了像"dead""alive"这样的字符串,它就是one气球。你可以用一个线程(一个变量,一个列表,或者其他什么)来约束它,但是你不能替换其中的字母。您只能将该线程绑定到一个完全的新字符串。

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

你可能也想读Ned Batchelder's treatise on Python names

相关问题 更多 >