1.全局变量与局部变量
注意最后一条:如果在函数内使用全局变量而不声明的话就会报错;因为可能会被当成是局部变量
#测试全局变量,局部变量
a=3
def test01():
b=4
print(b*10)
print(a)
a=300
print(a)
test01()
结果:
40
Traceback (most recent call last):
File "D:/pythonProject/hello.py", line 11, in <module>
test01()
File "D:/pythonProject/hello.py", line 6, in test01
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
进程已结束,退出代码1
所以应该先声明一下,声明之后在函数内对它做的修改,在函数外依然有效。可以看到在函数内把全局变量a改为300,函数外也还是300。
#测试全局变量,局部变量
a=3
def test01():
b=4
print(b*10)
global a
print(a)
a=300
print(a)
test01()
print(a)
结果:
40
3
300
300
进程已结束,退出代码
在函数内如果只想使用局部变量,那就直接用,但是函数外依然是全局变量在起作用
#测试全局变量,局部变量
a=3
def test01():
a=300
print(a)
test01()
print(a)
结果:
300
3
进程已结束,退出代码0
可以看到函数内a是300,函数外的a还是3
2.
测试之后可以看到,把可变对象a传给m,地址是一样的,传递对象没有变过,a的值改变了
#测试参数传递
a=[10,20]
print(id(a))
def test02(m):
print(id(m))
m.append(300)
print(id(m))
test02(a)
print(a)
结果:
2077683150216
2077683150216
2077683150216
[10, 20, 300]
进程已结束,退出代码0
传递不可变参数时,仍然是地址在传递,但是在函数内进行赋值操作时会产生一个新的对象,因此id改变了,值改变了,但是a本身不管地址还是数值都没有改变。
#测试参数传递
a=100
print(id(a))
def test02(m):
print(id(m))
m+=300
print(m)
print(id(m))
test02(a)
print(a)
print(id(a))
测试结果:
1364049184
1364049184
400
2621715885808
100
1364049184
进程已结束,退出代码0
2.浅拷贝与深拷贝
赋值操作时,浅拷贝会修改”原本”的内容;深拷贝复制”原本’'所有的内容,并且只会在副本上修改。
3.
4.
f=lambda a,b,c,d: a*b*c*d
print(f(1,2,3,4))
测试结果;
24
进程已结束,退出代码0
5.递归的两个条件:
def test01(n):
print("testoq1:",n)
if n==0:
print("over")
else:
test01(n-1)
print("test***",n)
test01(4)
结果如下:
testoq1: 4
testoq1: 3
testoq1: 2
testoq1: 1
testoq1: 0
over
test*** 0
test*** 1
test*** 2
test*** 3
test*** 4
进程已结束,退出代码0