在可变和不可变对象的情况下,Python对象引用和变量之间的区别

时间:2017-12-27 10:28:34

标签: python variables object cpython

我正在读一本关于python的书:

  

一旦我们有了一些数据类型,接下来我们需要的是变量   存储它们。 Python没有这样的变量,而是有对象   引用。当谈到像int和strs这样的不可变对象时,就会有   变量和对象引用之间没有明显的区别。至于   可变对象,有区别,但在实践中很少有用。“

现在没有提到有什么区别,我无法对这个概念表示清楚。

什么是对象引用(是cpython的内存地址)? 实际上什么是变量是一个绑定到对象引用的名称(我对内存引用的理解是,它是cpython内存中的一个地址,如果我错了就明白这个。)

如果可以根据它在C中的内部实现进行解释以及如何管理这些内容并在内部工作,将会有所帮助。

如果可以提供一些详细解释cpython实现的资源,也会有所帮助。

2 个答案:

答案 0 :(得分:2)

Ex:C ++

void passByValueFunction(int a)
{
    //Changing argument
    a = 20;
}
int main ()
{
    int a = 10;
    std::cout << a;
    passByValueFunction(a);
    //a will not change after passByValueFunction changes its value
    std::cout << a;  
}

Ex:Python

def passByValue(a):
    a = 20
a = 10
print a
passByValue(a)
# a will not change
print a

+按地址传递并通过引用传递:C ++可以通过地址(通过指针)或通过引用(引用变量)传递。结果是变量的值在更改函数后会发生变化。在python中,如果将一个可变变量传递给一个函数,它的值将会改变。

Ex: C++

    void passByRef(int &a)
    {
      a = 20
    }
    int main ()
    {
      a = 10;
      std::cout << a;
      passByRef(a);
      //The value of a will be change
      std::cout << a;
    }

Ex:Python

def passByRef(list):
  list = [22,33]
list = [11,44]
print list
passByRef(list)
#List will be change
print list

答案 1 :(得分:0)

作者说,当涉及到不可变对象时,你也可以忽略这些引用,因为你总是将对intstr对象的引用替换为对另一个对象的引用。对象

所以

a = 5
a = a + 10

会将a设置为对新int对象的引用。毕竟,你不能直接改变那个对象。

他们进一步区分变量和对象引用。 Python的名称(通常称为变量)不直接存储值(就像在C或其他语言中那样),它们总是引用a = 5使a引用了int类型的对象,其值为5,而在C中,a需要intget_template_directory_uri() 1}}直接保存值的变量。

我会发现这个解释也很混乱,因为 mutable 对象会发生的事情是它们自己包含你改变的引用。列表只是一系列引用,每个引用都由索引寻址。您可以通过添加更多引用(扩展列表)或通过更改引用(分配给索引)来改变列表。

我强烈建议您阅读Ned Batchelder's Facts and myths about Python names and values,这是对Python模型如何工作的更清晰的解释。

我不担心如何在C中实现这一点。 CPython只使用很多指针来构建内存堆上的对象。