当我写下这段代码时:
polly = "alive"
palin = ["parrot", polly]
print(palin)
polly = "dead"
print(palin)
我原本以为它会输出以下内容:
"['parrot', 'alive']"
"['parrot', 'dead']"
然而,它并没有。它输出的是:
['parrot', 'alive']
['parrot', 'alive']
如何使其输出前者?
当我写下这段代码时:
polly = "alive"
palin = ["parrot", polly]
print(palin)
polly = "dead"
print(palin)
我原本以为它会输出以下内容:
"['parrot', 'alive']"
"['parrot', 'dead']"
然而,它并没有。它输出的是:
['parrot', 'alive']
['parrot', 'alive']
如何使其输出前者?
Python变量持有对值的引用。因此,当您定义palin
列表时,传递的是由polly
引用的值,而不是变量本身。
您可以将值想象成气球,变量是系着气球的线程。 "alive"
是一个气球,polly
只是连接到该气球的线程,palin
列表有一个连接到同一气球的不同线程。在Python中,列表只是一系列编号从0开始的线程。
接下来,您将polly
字符串连接到一个新的气球"dead"
,但列表仍然保留着连接到"alive"
气球的旧线程。
您可以通过按索引重新分配列表以引用每个线程来替换列表所持有的"alive"
线程。在您的示例中,这是线程1
:
>>> palin[1] = polly
>>> palin
['parrot', 'dead']
这里我简单地把 palin[1]
线程和 polly
绑在了一起,无论它们绑的是什么。
请注意,Python 中的任何集合,如dict
、set
、tuple
等,都只是线程的集合。其中一些可以将其线程替换为不同的线程,例如列表和字典,这就是使 Python 中的某些东西“可变”的原因。
另一方面,字符串是不可变的。一旦你定义了一个字符串,比如说:"dead"
或者"alive"
,那么它就是一个气球。你可以用一个线程(变量、列表或其他)将其系住,但是你不能更改其中的字母。你只能将该线程与全新的字符串绑定。
Python 中的大多数事物都可以像气球一样。整数、字符串、列表、函数、实例、类,所有这些都可以被绑定到一个变量上,或者被绑定到一个容器中。
您可能还想阅读Ned Batchelder对Python名称的探讨。
palin
中:palin = ["parrot", polly]
polly
的值来在其他地方产生更改。polly = "dead"
这一行是重新绑定操作,而不是突变操作。 - David Robinsonpolly = ["alive"]
palin = ["parrot", polly]
print(palin)
polly[0] = "dead"
print(palin)
>>> a = 'a'
>>> list = ['a',lambda: a]
>>> list[1]
<function <lambda> at 0x7feff71dc500>
>>> list[1]()
'a'
>>> a = 'b'
>>> list[1]()
'b'
lambda: a
实际上是一个函数,它只返回存储在 a
中的值。这就是为什么你可以使用命令 list[1]()
;它意味着你调用存储在 list[1]
中的函数。(另外,适当的 gravatar,@Jonatan) - Matthew Adams不行。在Python中,对裸名称的赋值操作总是只重新绑定名称,您无法自定义或监视此操作。
您可以将polly
变成可变对象而不是字符串,并改变其值而不是重新绑定名称。以下是一个简单的示例:
>>> polly = ['alive']
>>> items = ['parrot', polly]
>>> items
['parrot', ['alive']]
>>> polly[0] = 'dead'
>>> items
['parrot', ['dead']]
class Animal:
def __init__(self, aniType, name):
self.aniType = aniType
self.name = name
self.isAlive = True
def kill(self):
self.isAlive = False
def getName(self):
return self.name
def getType(self):
return self.aniType
def isLiving(self):
return self.isAlive
polly = Animal("parrot", "polly")
print(polly.getName()+' the '+polly.getType()+' is alive?')
print(polly.isLiving())
polly.kill()
print(polly.getName()+' the '+polly.getType()+' is alive?')
print(polly.isLiving())
对于一个简单的任务来说,一开始可能会觉得代码量很大,但是对象通常是处理这种事情的方式,因为它们有助于保持所有内容的组织。
以下是该程序的输出:
polly the parrot is alive?
True
polly the parrot is alive?
False