Python 指定参考资料
有没有办法在python中分配引用 例如,在php中,我可以这样做:Python 指定参考资料,python,Python,有没有办法在python中分配引用 例如,在php中,我可以这样做: $a = 10; $b = &$a; $a = 20; echo $a." ".$b; // 20, 20 在python中如何执行相同的操作?在python中,如果您使用非原语类型执行此操作,它的行为与您想要的完全一样:使用引用完成赋值。这就是为什么在运行以下操作时: >>> a = {'key' : 'value'} >>> b = a >>> b['ke
$a = 10;
$b = &$a;
$a = 20;
echo $a." ".$b; // 20, 20
在python中如何执行相同的操作?在python中,如果您使用非原语类型执行此操作,它的行为与您想要的完全一样:使用引用完成赋值。这就是为什么在运行以下操作时:
>>> a = {'key' : 'value'}
>>> b = a
>>> b['key'] = 'new-value'
>>> print a['key']
>>> a = 5
>>> b = a
>>> print id(a) == id(b)
>>> print id(b)
>>> b = b + 1
>>> print id(b)
您将获得“新值”
。
严格地说,如果您执行以下操作:
>>> a = {'key' : 'value'}
>>> b = a
>>> b['key'] = 'new-value'
>>> print a['key']
>>> a = 5
>>> b = a
>>> print id(a) == id(b)
>>> print id(b)
>>> b = b + 1
>>> print id(b)
你会实现的
但是由于基元类型是不可变的,因此不能更改变量b
本身的值。您只需基于b
创建一个具有新值的新变量即可。例如,如果您执行以下操作:
>>> a = {'key' : 'value'}
>>> b = a
>>> b['key'] = 'new-value'
>>> print a['key']
>>> a = 5
>>> b = a
>>> print id(a) == id(b)
>>> print id(b)
>>> b = b + 1
>>> print id(b)
您将得到两个不同的值
这意味着Python创建了一个新变量,根据b的值计算其值,然后给这个新变量命名为b
。这涉及所有不可变类型。将前面的两个示例连接在一起:
>>> a = 5
>>> b = a
>>> print id(a)==id(b)
True
>>> b += 1
>>> print id(b)==id(a)
False
所以,当您在Python中赋值时,总是赋值引用。但是有些类型是不能更改的,所以当您做一些更改时,实际上是用另一个引用创建了一个新变量。在Python中,默认情况下所有内容都是引用。所以当你做一些类似的事情时:
x=[1,2,3]
y=x
x[1]=-1
print y
它打印[1,-1,3]
当你这样做的时候,这不起作用的原因是
x=1
y=x
x=-1
print y
就是
int
s是不可变的。它们无法改变。想想看,一个数字真的会改变吗?当您为x
分配新值时,您正在分配新值,而不是更改旧值。所以y仍然指向旧的那个。其他不可变类型(例如字符串和元组)的行为方式相同 出于兴趣,为什么?你用它做什么?cru3l有没有问过如何编写好的程序或者如何做一些特别的事情?在Python中,这种编程风格可能不合适或不可能,但他为什么要使用引用并不重要。他在问这个问题,而这并不涉及解决他更广泛的问题。@Noctis:如果我们都只解决假定的问题,这个网站就不存在。@Noctis Skytower:“cru3l问过如何编写好的程序吗?”。是的,他们问过如何写一个好的程序。他们走错了路,走到了死胡同,请求帮助。他们需要正确的解决方案,而不是一些无用的复杂的工作,不能解决他们真正的问题谢谢你帮助我理解。这提醒我要提防那些妄自尊大的人,他们会推断出未经证实的问题并试图解决它们。在Python中具有不可变对象的对象标识。这可能不是你所期望的。嗯,很有趣。谢谢你的例子。但是在a=257之后\n b=a表达式总是给出a is b==True,对吗?python中没有基元类型。是的,我知道。我只是想,这种类似Java的术语会让事情更容易理解。使用这种类似Java的术语充其量只是让人困惑。Java程序员可能认为1
在Python中也是一个原语。原因与int是不可变的这一事实无关。在第二个示例中,将x重新绑定到-1,y仍然绑定到1。