我正在读一本关于python的书:
一旦我们有了一些数据类型,我们需要的下一件事就是存储它们的变量。 Python没有这样的变量,而是具有对象引用。当谈到像int和strs这样的不可变对象时,变量和对象引用之间没有明显的区别。至于可变对象,则存在差异,但在实践中很少发生。“
现在没有提到有什么区别,我无法清楚自己这个概念。
什么是对象引用(是cpython的内存地址)?实际上什么是变量是一个绑定到对象引用的名称(我对内存引用的理解是,它是cpython内存中的一个地址,如果我错了就清楚我这个)。
如果能够根据它在C中的内部实现进行解释以及如何在内部管理和工作这将是有帮助的。
如果可以提供一些详细解释cpython实现的资源也会很有帮助。
例如: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;
}
来源: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;
}
来源:Python的
def passByRef(list):
list = [22,33]
list = [11,44]
print list
passByRef(list)
#List will be change
print list
作者说,当涉及到不可变对象时,你也可以忽略引用,因为你总是用对另一个这样的对象的引用来替换对int
或str
对象的引用。
所以
a = 5
a = a + 10
将a
设置为对新的int
对象的引用。毕竟,你不能直接改变那个对象。
它们进一步区分变量和对象引用。 Python的名称(通常称为变量)不直接存储值(就像在C或其他语言中那样),它们总是引用。 a = 5
使a
引用了int
类型的对象,其值为5,而在C
中,它需要a
为int
变量,它直接保存值。
我会发现这个解释也令人困惑,因为可变对象所发生的事情是它们本身包含你改变的引用。列表只是一系列引用,每个引用都由索引寻址。您可以通过添加更多引用(扩展列表)或通过更改引用(分配给索引)来改变列表。
我强烈建议你阅读Ned Batchelder's Facts and myths about Python names and values,这是对Python模型如何工作的更清晰的解释。
我不担心这在C中是如何实现的。 CPython只使用很多指针来构建内存堆上的对象。