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