浅拷贝与深拷贝例题与思考


title: “浅拷贝与深拷贝”
author: “hou wei”
date: “2023-04-17”
output: html_document

knitr::opts_chunk$set(echo = TRUE)

问答题

0.请问你是如何理解 ”在 Python 中,变量不是盒子” 这句话的?

变量不是将元素放进变量里面,变量只是与数据挂钩,相当于赋值一个引用。

1.请问下面代码执行后,y 的值是多少?

x = 1
y = x
x = 2
y

y的值为1,此处改变了变量的引用所以,y值是不会变的

2. 请问下面代码执行后,x == y 返回的结果是 True 还是 False?

x = [1, 2, 3]
y = x
y[1] = 1
x == y

返回的结果是Ture。此处只改变了值没有改变引用所以会变换。

3.请问下面代码实现的是浅拷贝还是深拷贝?

x = [[1, 2, 3], [4, 5, 6]]
y = x[:]

我们使用切片还有x.copy()都是浅拷贝。

4.请问下面代码执行后,列表 x 和 y 的内容分别是什么?

x = [[1, 2, 3], [4, 5, 6]]
y = x.copy()
y.append(7)
y[1].append(8)
x
y

x内容为[[1, 2, 3], [4, 5, 6, 8]],y的内容为[[1, 2, 3], [4, 5, 6, 8], 7]。此处浅拷贝只是拷贝了外层对象,如果涉及到嵌套,内层的元素还是引用传递。如果是引用传递的话,则为动一处而变全身。

5.请问下面代码执行后,列表 s 的内容是什么?

s = [1]
s.append(s)
s

s列表的内容将会是[1, [...]]这会使Python进入无限循环,因为添加s之后你会发现原来的列表也会变,之前列表变了之后,你添加的这个也应该是变化的,所以无解了就。

动动手

0.创建一个 88 x 88 的随机整数矩阵(二维列表),然后匹配用户输入的整数是否与其中某元素相等,如果相等则打印其行号和列号。

要求1:随机整数取值范围 0~1024
要求2:需找出所有匹配的元素
思路:此处分为两步,第一步创建一个符合要求的二维列表,第二步使用for循环遍历,使用while函数或者if判断,如果与输入整数相等,则打印其行号与列号。

num = input("请输入一个代匹配的整数:")
import random
matrix = []
for i in range(88):
    row = []
    for j in range(88):
        row.append(random.randint(0,1024))
    matrix.append(row)

for i in range(88):
    for j in range(88):
        if matrix[i][j] == num:
            print(i,j)

1.请编程找出矩阵中的幸运数字。

说明:假设给定一个 m * n 的矩阵(矩阵中数值的取值范围是 0~1024,且各不相同),如果某一个元素的值在同一行的所有元素中最小,并且在同一列的所有元素中最大,那么该元素便是幸运数字。
假设给定的矩阵如下:

matrix = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]

那么输出结果应该是 66(同时满足同一行的所有元素中最小,并且在同一列的所有元素中最大)。

此题也是分为两步,第一步创建矩阵,要求是 m * n,取值范围是0~1024,而且各不相同。第二步是进行比较同行最小,同列最大,也就是说是max(matrix[i][j], max_col[j],min(matrix[i][j], min_row[i])如果同行最小与同列最大相等,就说明其是我们需要的元素。

matrix = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
# 算出举证的行数与列数,方便后面for循环遍历
row = len(matrix)
col = len(matrix[0])

#先快速生成一个指定长度的列表,列表中的元素初始化为同一个值,这样做可以简化程序代码,提高程序的可读性。
min_row = [1024] * row
max_col = [0] * col

# 遍历矩阵中的每一个元素
# 找到每行中最小的元素,并将它们存放到列表min_row中
# 找到每列中最大的元素,并将它们存放到列表max_col中
for i in range(row):
    for j in range(col):
        min_row[i] = min(matrix[i][j], min_row[i])
        max_col[j] = max(matrix[i][j], max_col[j]
        
# 遍历矩阵中的每一个元素
# 判断是否同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”
for i in range(row):
    for j in range(col):
        if matrix[i][j] == min_row[i] and matrix[i][j] == max_col[j]:
            print(matrix[i][j])

在这段代码中,min(matrix[i][j], min_row[i]) 的作用是求矩阵中第 i 行的最小值。首先,程序将 min_row[i]的初始值设为一个很大的数(这里是 1024),然后遍历矩阵中第 i 行的所有元素,将每个元素与 min_row[i] 比较,取其中的最小值。最终,min_row[i] 中存储的就是矩阵中第 i 行的最小值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
拷贝构造函数是一种特殊的构造函数,在创建一个新对象时,它会从另一个已存在的对象中复制构造函数参数。其函数原型为: ``` 类名(const 类名 &obj) ``` 其中,参数列表中的 "const" 关键字表示输入参数为只读, "&" 符号表示传递的是引用类型,即万一传进来的是个 reference ,就不会产生歧义。 以下是一个拷贝构造函数的示例代码: ``` #include <iostream> using namespace std; class Box { public: // 通常的构造函数 Box(double l = 2.0, double b = 2.0, double h = 2.0) { cout <<"Constructor called." << endl; length = l; breadth = b; height = h; } // 拷贝构造函数 Box(const Box &B) { cout << "Copy constructor called." << endl; length = B.length; breadth = B.breadth; height = B.height; } double Volume() { return length * breadth * height; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; int main() { Box Box1(3.3, 1.2, 1.5); //声明对象时调用了通常的构造函数 Box Box2(Box1); //声明对象时调用了拷贝构造函数 // 输出 Box1 的体积 cout << "Box1 的体积:" << Box1.Volume() << endl; // 输出 Box2 的体积 cout << "Box2 的体积:" << Box2.Volume() << endl; return 0; } ``` 在上面的代码中,我们声明了一个 Box 类,并声明了一个常用的构造函数和一个拷贝构造函数。这里的 Box1 对象调用了常用的构造函数,而 Box2 对象则在声明时调用了拷贝构造函数。最后,通过 Volume() 函数计算 Box1 和 Box2 对象的体积并输出。 希望这个示例能帮助你理解拷贝构造函数的概念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

μμ豆奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值