Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和Python在赋值方面的区别是什么?_Php_Python_Variable Assignment - Fatal编程技术网

PHP和Python在赋值方面的区别是什么?

PHP和Python在赋值方面的区别是什么?,php,python,variable-assignment,Php,Python,Variable Assignment,我已经学习了PHP,现在我正在学习Python。我用两种语言编写了这段代码,但其行为有所不同 PHP: y在PHP中为空,但在Python中不为空 我想知道为什么..在PHP中,当分配$y=$x时,它会复制数组。在Python中,字典是对象,您只需复制引用,而不是字典本身。如果要复制词典,有一种方法: x = {} y = x.copy() x['key'] = 'value' print(x) print(y) 在PHP中,当分配$y=$x时,它复制数组。在Python中,字典是对象,您只需

我已经学习了PHP,现在我正在学习Python。我用两种语言编写了这段代码,但其行为有所不同

PHP:

y
在PHP中为空,但在Python中不为空


我想知道为什么..

在PHP中,当分配
$y=$x
时,它会复制数组。在Python中,字典是对象,您只需复制引用,而不是字典本身。如果要复制词典,有一种方法:

x = {}
y = x.copy()
x['key'] = 'value'
print(x)
print(y)

在PHP中,当分配
$y=$x
时,它复制数组。在Python中,字典是对象,您只需复制引用,而不是字典本身。如果要复制词典,有一种方法:

x = {}
y = x.copy()
x['key'] = 'value'
print(x)
print(y)

有些人说python没有变量,python有名称。和名称指定给值,而不是指定给变量的值

比如说,

    x =23

现在做你以前做过的:

    x = 23
    y = x

如您所见,没有创建两个值,而是两个名称指向同一个值23

所以,我想你现在明白了形势。两者都指向相同的值


因此,在您的示例中,两者都指向同一个字典。如果一个名字改变了字典会发生什么。其他名称会有这种变化,因为它们指向同一本词典。希望它能被清除。

有些人说python没有变量,python有名称。和名称指定给值,而不是指定给变量的值

比如说,

    x =23

现在做你以前做过的:

    x = 23
    y = x

如您所见,没有创建两个值,而是两个名称指向同一个值23

所以,我想你现在明白了形势。两者都指向相同的值


因此,在您的示例中,两者都指向同一个字典。如果一个名字改变了字典会发生什么。其他名称会有这种变化,因为它们指向同一本词典。希望它能澄清。

理解赋值在python中是如何工作的非常重要。在值/引用之上,它还替代/影响变量声明/范围/类型。请现在花点时间学习,避免以后被咬;PHP中的数组在赋值时被克隆/复制(实际上比这更复杂,复制被巧妙地延迟,但实际上赋值后有两个数组)。在Python中,赋值时不会克隆/复制任何对象,包括字典/列表,因此仍然有一个字典。。有两个不同的名字。这也解释了在PHP中传递数组和在Python中传递列表时的行为差异。PHP对象赋值的工作原理与Python中的相同。理解赋值的工作原理在Python中非常重要。在值/引用之上,它还替代/影响变量声明/范围/类型。请现在花点时间学习,避免以后被咬;PHP中的数组在赋值时被克隆/复制(实际上比这更复杂,复制被巧妙地延迟,但实际上赋值后有两个数组)。在Python中,赋值时不会克隆/复制任何对象,包括字典/列表,因此仍然有一个字典。。有两个不同的名字。这也解释了在PHP中传递数组和在Python中传递列表时的行为差异。PHP对象赋值的工作原理与Python中的一样,虽然它包含真实的信息,但介绍结论是误导性的;对象赋值在PHP中的工作方式与在Python中的工作方式相同。PHP中数组的赋值和传递是不同的,因为它具有克隆/复制语义。此外,虽然不可变原语值(例如“整数”)的赋值实现方式不同,但实际上它们在语义上是等价的。这使得整数在尝试和说明行为时尤其糟糕;词典/列表会是一个更好的目标,更符合问题。虽然它包含真实的信息,但导言结论是误导性的;对象赋值在PHP中的工作方式与在Python中的工作方式相同。PHP中数组的赋值和传递是不同的,因为它具有克隆/复制语义。此外,虽然不可变原语值(例如“整数”)的赋值实现方式不同,但实际上它们在语义上是等价的。这使得整数在尝试和说明行为时尤其糟糕;字典/列表会是一个更好的目标,并且更符合问题的要求。关于php,这并不完全正确。PHP是写时复制而不是分配时复制。@Josh:这是一个实现细节,如果有的话。这是一个与原始问题相关的实现细节。Python将名称指向变量位置。php增加zval的refcount。如果zval是一个对象,那么两个变量都指向同一个对象。如果zval是标量,那么任何写操作都会导致zval复制,并且原始zval的引用计数会减少。@Josh:但从功能上讲,对于语言用户来说,它的行为就像是一个副本,不是吗?如果是这样的话,这是一个有趣的技术细节,但对于理解PHP和Python在这方面的语义差异并不是必需的,我们必须同意不同意。OP特别要求了解在何种情况下可能相关的差异。写时复制意味着当有多个名称指向值时,在内存使用方面更接近Python的行为。如果你要向同事解释某事是如何工作的,你不能忽略技术细节。如果这是一个外行的问题,那么我会同意。关于php,这并不完全正确。PHP是写时复制而不是分配时复制。@Josh:这是一个实现细节,如果有的话。这是一个与原始问题相关的实现细节。Python将名称指向变量位置。php增加zval的refcount。如果zval是一个对象,那么两个变量都指向