n = 1
print id(n)
def e(n):
print id(n)
n = n+1 #生成了一个新对象,左边的n。是局部变量,函数内外,同名变量名是隔离的。
print id(n)
return n #将新对象返回
x = e(n)
print x
print id(x)
o = 2
print id(o)
def m(n):
print id(n)
n = n + 1 #生成了一个新对象,但是该函数并没有将新对象返回,而是在函数运行完之后,这个局部变量被释放了。
print id(n)
m(o)
print o
print id(o)
a = [1,2,3]
#a = [1,2,3,4,5,6,7,8,9]
print id(a)
def f(n):
print id(n)
m = n
print id(m)
if len(m) >5: #如果这个为真 ,
m = [9,8,7,6,5,4] #那么 m也会是一个新对象。
print id(m)
for i,e in enumerate(m):
if isinstance(e,int):
m[i]=str(e)+'e' #如果上面那个if不为真,那么m和n一致,是同一个对象。那么对其修改,函数内外皆可见,如果 if条件为真,那么m和n 不再是同一个对象了。函数内外也就不一致了。
return m
z = f(a)
print z
print id(z)
print a
print id(a)
s = 0
def h():
s = 10 #和函数外的 s 是隔离的。
print s
print s
h()
python
的函数是传对象 ,函数参数在传递过程中,将整个对象传入。对可变对象的修改,函数内外都是可见的。调用者和被调用者共享整个对象。
对于不可变对象,由于不可变对象的不可变性,所以,对不可变对象的修改,往往是生成一个新的对象来赋值实现的。
def a(**kwargs):
print kwargs
a(host='127.0.0.1',db='mysq')
# a({"host":"127.0.0.1","db":"mysq"}) #error
a(**{"host":"127.0.0.1","db":"mysq"})