Python程序中存储的所有数据都是对象,每一个对象有一个身份,一个类型和一个值。
看变量的实际作用,执行a = 8 这行代码时,就会创建一个值为8的int对象。
变量名是对这个"一个值为8的int对象"的引用。(也可以简称a绑定到8这个对象)
1、可以通过id()来取得对象的身份
这个内置函数,它的参数是a这个变量名,这个函数返回的值
是这个变量a引用的那个"一个值为8的int对象"的内存地址。
>>> a = 8
>>> id(8)
4298180944
>>> help(id)
Help on built-in function id in module builtins:
id(obj, /)
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
2、可以通过type()来取得a引用对象的数据类型
>>> a = 8
>>> id(8)
4298180944
>>> type(a)
<class 'int'>
3、对象的值
当变量出现在表达式中,它会被它引用的对象的值替代。
总结:类型是属于对象,而不是变量。变量只是对对象的一个引用。
对象有可变对象和不可变对象之分。
Python函数传递参数到底是传值还是引用?
传值、引用这个是c/c++中的概念,Python中一切都是对象,
实参向形参传递的是对象的引用值。就像Python赋值的意思。
请看代码
# coding:utf-8
def foo(a):
print(f"传来是对象的引用 对象地址为{id(a)}")
a = 3 #形式参数a是局部变量、a重新绑定到3这个对象。
print("变量a新引用对象地址为{0}".format(id(a)))
print(a)
x = 5
print("全局变量x引用的对象地址为{0}".format(id(x)))
foo(x)
print(x)
#由于函数内部a绑定到新的对象,也就修改不了全部变量x引用的对象5
#全局变量x引用的对象地址为4298181192
#传来是对象的引用 对象地址为4298181192
#变量a新引用对象地址为4298181240
#3
#5
# coding:utf-8
def foo(a):
"""在函数内部直接修改了同一个引用指向的对象。
也就修改了实际参数传来的引用值指向的对象。
"""
a.append("can change object")
return a
lst = [1,2,3]
print(foo(lst))
print(lst)
#[1, 2, 3, 'can change object']
#[1, 2, 3, 'can change object']
# coding:utf-8
def foo(a):
"""实际参数传来一个对象[1,2,3]的引用,但是形式参数(局部变量a
重新引用到新的对象,也就是说保存了新的对象)
当然不能修改原来的对象了。
"""
a = ["黄哥Python培训","黄哥"]
return a
lst = [1,2,3]
for item in foo(lst):
print(item)
print(lst)
#黄哥Python培训
#黄哥
#[1, 2, 3]
总结:Python函数传递的是对象的引用值,非传值或传引用。
但是如果对象是不可变的,感觉和c语言中传值差不多。
如果对象是可变的,感觉和c语言中传引用差不多。
PS: python内置的一些类型中
- 可变对象:list dict set
- 不可变对象:tuple string int float bool