【python基础巩固】引用、浅深拷贝你分清了吗?
引用、浅拷贝深拷贝
下面代码运行后,a、b、c、d四个变量的值,描述错误的是?
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
这段代码的意思是:
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
c = copy.copy(a) # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
d = copy.deepcopy(a) #深拷贝,完全拷贝,完全独立于原对象,a变也不变
a.append(5) # 改变父对象
a[4].append('c') #改变父对象中的 ['a', 'b']子对象
因此结果是:
a=[1, 2, 3, 4, [‘a’, ‘b’,‘c’],5]
b=[1, 2, 3, 4, [‘a’, ‘b’,‘c’],5]
c=[1, 2, 3, 4, [‘a’, ‘b’,‘c’]]
d=[1, 2, 3, 4, [‘a’, ‘b’]]
练习:拔高题
1、python变量的查找顺序为局部作用域>外部嵌套作用域>全局作用域>内置模块作用域。
python中的4种作用域
L:Local,局部作用域,也就是我们在函数中定义的变量;
E:Enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:Globa,全局变量,就是模块级别定义的变量;
B:Built-in,系统内置模块里面的变量,比如int, bytearray等。
2、python my.py v1 v2 命令运行脚本,通过 from sys import argv如何获得v2的参数值?( )
argv[2]
sys.argv是传递给python脚本的命令行参数字符串列表,argv[0]为该脚本自身路径,其余为命令行参数。
sys.argv是命令参数表,包括文件名
argv[0]: 【path】/my.py
argv[1]: v1
argv[2]: v2
3、下列程序打印结果为()
import re
str1 = "Python's features"
str2 = re.match( r'(.*)on(.*?) .*', str1, re.M|re.I)
print str2.group(1)
答案:
Pyth
解析:
re模块实现正则的功能
re.match(正则表达式,要匹配的字符串,[匹配模式])
要匹配的字符串为str1 = “Python’s features”
正则表达式r’(.)on(.?) .*’
r表示后面的字符串是一个普通字符串(比如\n会译为\和n,而不是换行符)
()符号包住的数据为要提取的数据,通常与.group()函数连用。
.匹配单个任意字符
*匹配前一个字符出现0次或无限次
?匹配前一个字符出现0次或1次
(.)提取的数据为str1字符串中on左边的所有字符,即Pyth
(.?)提取的数据为str1中on右边,空格前面,即’s
.group(0)输出的是匹配正则表达式整体结果
.group(1) 列出第一个括号匹配部分,.group(2) 列出第二个括号匹配部分
4、分析代码:
class Rect:
def __init__(self,width,height):
self.width = width
self.height = height
@property
def area(self):
return self.height* self.width
rect = Rect(10,20)
rect.area()
使用property会将方法转为属性,因此rect.area()应该改为rect.area。
a = 0
def fun():
a += 1
print(a)
fun()
当给作用域中的一个变量赋值时,Python 会自动的把它当做是当前作用域的局部变量,从而会隐藏外部作用域中的同名变量,因此a += 1会报错。
class Animal:
def __init__(self,color="白色"):
Animal.color = color
def get_color(self):
print("Animal的颜色为",Animal.color)
class Cat(Animal):
def __init__(self):
pass
cat = Cat()
cat.get_color()
子类若有定义__init__()函数时,将不会自动继承父类的构造函数,因此在调用父类的get_color()函数时,会出现Animal找不到属性color,修改时只需在子类的__init__()函数中添加语句:super().init()。
class Cat:
def __init__(self,color="白色"):
self.__color = color
cat = Cat("绿色")
print(cat._Cat__color)
尽管color属性为私有属性,但是在类外部使用时,仍可以通过实例名._类名__xxx来访问。
5、以下程序要求用户输入二进制数字0/1并显示之,请指出程序中代码第几行存在错误()
1.bit = input("Enter a binary digit:")
2.if bit = 0 or 1:
3. print("your input is" ,bit)
4.else
5. print("your input is invalid")
第2行语法错误,第4行else后缺少冒号。