-
2021-03-21 19:35:25
列表初始化
由来
C++在初始化数组时,可以使用下面花括号加初始值的形式:
int arr[] = {1, 2, 3};
在C++中,如有下面这样的类:
class Tester { public: Tester(int value):m_value(value * 2){} void print(){ cout << m_value << endl; } private: int m_value; };
那么它的初始化可以写成这样:
Tester tester_array[] = {6, 7, 8, 9, 10};
Tester的构造函数可以被正常的调用
问题是这种方法的运用范围很窄,很多场景都用不了。比如
vector
vector<int> int_vector;
它的初始化方法就下面两种:
int_vector.push_back(5); int_vector.push_back(4); int_vector.push_back(3); int_vector.push_back(2); int_vector.push_back(1);
int int_array[] = {1, 2, 3, 4, 5}; for(int i = 0; i < sizeof(int_array)/sizeof(int_array[0]); ++i) { int_vector.push_back(int_vector[i]); }
无论哪种方法,都给人一种如鲠在喉的感觉
因此,C++11中扩展了使用花括号初始化变量的应用范围,称这种初始化方式为列表初始化
比如:
vector<int> int_vector = {5, 4, 3, 2, 1}; list<int> int_list = {5, 4, 3, 2, 1}; map<int, const char*> id2Name = {{1,"Zhang"},{2, "Wang"},{3, "Li"}};
另一种写法:
下面和写法也合法,和上面的几种写法等价。vector<int> int_vector{5, 4, 3, 2, 1}; list<int> int_list {5, 4, 3, 2, 1}; map<int, const char*> id2Name{{1,"Zhang"},{2, "Wang"},{3, "Li"}};
使用场景
在使用大括号内的初始值设定项列表初始化变量时,将发生列表初始化。 大括号内的初始值设定项列表可在以下情况中使用:
- 初始化变量
- 使用关键字初始化类 new
- 从函数返回对象
- 自变量传递给函数
- 直接初始化中的自变量之一
- 在非静态数据成员的初始值设定项中
- 在构造函数初始值设定项列表中
class MyClass { public: MyClass(int myInt, char myChar) {} private: int m_int[]{ 3 }; char m_char; }; class MyClassConsumer{ public: void set_class(MyClass c) {} MyClass get_class() { return MyClass{ 0, '\0' }; } }; struct MyStruct{ int my_int; char my_char; MyClass my_class; }; int main() { MyClass mc1{ 1, 'a' }; MyClass* mc2 = new MyClass{ 2, 'b' }; MyClass mc3 = { 3, 'c' }; MyClassConsumer mcc; mcc.set_class(MyClass{ 3, 'c' }); mcc.set_class({ 4, 'd' }); MyStruct ms1{ 1, 'a', { 2, 'b' } }; }
使用大括号包围的值列表赋值
{}
包围的值列表除了可以用于初始化变量外,还可以用于赋值语句中。也就是说:
vector<int> vi{1, 2, 3, 4, 5};
也可以:
vector<int> vi; vi = {6, 7, 8, 9, 10};
和初始化一样,使用
{}
包围的值列表也有同样的优势:- 一个是防止窄化,可以简单的理解为防止精度降低。比如,下面的代码是无法编译通过的:
double pai = 3.1415926; int pi; pi = {pai}; //编译错误。
- 另外,如果
{}
里的初始化列表为空,编译器会创建一个值初始化的临时量并赋值给赋值对象
更多相关内容 -
下拉列表赋值和回显.txt
2022-04-25 18:23:46对于下拉列表,采用的是layui结合jQuery方式实现的,在与后台(后台采用springboot框架)交互采用了异步ajax交互,实现了下拉列表赋值与回显的功能。所谓赋值是从数据库中获取数据循环遍历赋值给前端下拉列表选项,... -
详解Python列表赋值复制深拷贝及5种浅拷贝
2020-09-19 09:38:57主要介绍了Python列表赋值,复制,深拷贝以及5种浅拷贝详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 -
Python中列表与列表赋值问题
2022-03-16 10:03:58为了解决以上情况,可以直接将ListB中的值赋给ListA,而不是将列表直接赋值过去 运行结果可看出不管改变哪个列表的值,另一个列表都不会发生变化 三、ListA[m:]=ListB ListA从序号m开始往后的元素全部用Lis.....定义两个列表ListA与ListB
一、ListA=ListB
运行结果发现,可以直接赋值
这时候给ListB添加一个元素,再运行
通过结果发现,一旦改变ListB的值,ListA的值也会随之发生改变
二、ListA=ListB[:]
为了解决以上情况,可以直接将ListB中的值赋给ListA,而不是将列表直接赋值过去
运行结果可看出不管改变哪个列表的值,另一个列表都不会发生变化
三、ListA[m:]=ListB
ListA从序号m开始往后的元素全部用ListB进行替换
结果可看出,列表ListA序号1也就是2的位置往后全部用ListB进行了替换,之后再改变ListB的元素,ListA也不会发生改变
-
python实现将列表中各个值快速赋值给多个变量
2020-09-17 14:56:59主要介绍了python实现将列表中各个值快速赋值给多个变量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
python中列表赋值后,改变拷贝列表数值,源列表也会发生变化——浅拷贝
2022-03-17 17:23:22一、浅拷贝和深拷贝 以下文章讲述得很清楚: ...在python中,新建对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。 二、Pyt一、浅拷贝和深拷贝
以下文章讲述得很清楚:
面试题:深拷贝和浅拷贝(超级详细,有内存图)_田江的博客-CSDN博客_深拷贝和浅拷贝
python深拷贝和浅拷贝的区别 - 米 立 - 博客园 (cnblogs.com)
python修改列表的值时的地址变化,一个蛮有意思的小实验 - 雾恋过往 - 博客园 (cnblogs.com)
在python中,新建对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
二、Python中浅拷贝
1、了解浅拷贝
列表赋值,也就是浅拷贝,属于引用类型,被赋值的列表与源列表共同引用一个地址,新列表的值发生改变,源列表的值也跟着变化。
import numpy as np A = [0,1,2,3,4,5,6,7,8] A1 = A; print(A) print(A1) # A1.append(9) print(A) print(A1) print('源列表A中各元素的地址:') for i in range(len(A)): print(id(A[i])) print('拷贝列表A1中各元素的地址') for i in range(len(A1)): print(id(A1[i]))
从运行结果中也可以看出A和A1引用了相同的地址。
2、拷贝分为:
(1)浅拷贝
A = A1 #改变A1的值,A的值也会发生变化
(2)copy浅拷贝
A1 = A.copy() #或者 import copy A1 = copy.copy(A) #改变A1的值,A的值不会发生改变,除非A中包含子对象,比如: #A = [0,1,2,[3,4,5],6,7,8] #A copy拷贝给A1之后,若给A1添加一个元素9,则: #A = [0,1,2,[3,4,5],6,7,8] 而A1 = [0,1,2,[3,4,5],6,7,8,9] #若给A1[3]这个元素[3,4,5]添加一个元素9,则: #A = [0,1,2,[3,4,5,9],6,7,8] A1 = [0,1,2,[3,4,5,9],6,7,8]
(3)深拷贝
import copy A1 = copy.deepcopy(A) #深拷贝则是无论A有无子对象,A1改变,A也不会发生改变。
3、代码解释:
import copy A = [0,1,2,[3,4,5],6,7,8] A1 = A #1、浅拷贝 #A1 = copy.copy(A) #2、copy浅拷贝 #A1 = copy.deepcopy(A) #3、深拷贝 print('源列表: %s' %A) print('拷贝列表: %s' %A1) A1.append(9) print('A1添加元素后的A列表:%s'%A) print('A1添加元素后的A1列表:%s'%A1) A1[3].append(9) print('A1的子对象添加元素后的A列表:%s'%A) print('A1的子元素添加元素后的A1列表:%s'%A1)
(1) 浅拷贝
结果可以看出:浅拷贝后,A和A1同步变化。
(2)copy浅拷贝
结果可以看到:copy浅拷贝之后,只有A和A1的子对象[3,4,5,9]同步变化。
(3)深拷贝
结果可以看到:A和A1不同步变化。
深拷贝为例,了解拷贝原理:
A1对A深拷贝之后,A1中的子对象[3,4,5]被拷贝到了另外的地址,其他元素依然引用源列表的地址,但在此基础上可以修改,却不改变源列表。
4、应用
python读取dicom图象,然后以不同窗宽显示:
import matplotlib.pyplot as plt import numpy as np import pydicom import cv2 import SimpleITK as sitk from skimage.morphology import disk, rectangle, binary_dilation, binary_erosion, binary_closing, binary_opening, rectangle, remove_small_objects import scipy def read_dicom_data(file_name): 'dicom图象读入' file = sitk.ReadImage(file_name) data = sitk.GetArrayFromImage(file) print(data.shape) data = np.squeeze(data, axis=0) print(data.shape) data = np.int32(data) dicom_dataset = pydicom.dcmread(file_name) slice_location = dicom_dataset.SliceLocation #获取层间距 return data, data.shape[0], data.shape[1], slice_location def window(window, img_data): 'dicom图象窗宽变换' if window == 'Lung': img_data[img_data < -1150] = -1150 img_data[img_data > 350] = 350 elif window == 'Pelvic': img_data[img_data < -140] = -140 img_data[img_data > 260] = 260 elif window == 'Chest': img_data[img_data < -250] = -250 img_data[img_data > 240] = 240 elif window == 'Pelvic_scatter': img_data[img_data < -700] = -700 img_data[img_data > 240] = 240 else: img_data[img_data < 0] = 0 img_data[img_data > 80] = 80 return img_data #读入dicom图像 dcm_path = 'E:/DeepLearningWorkSpace/PyCharmWorkSpace/date/CBCT_Pelvic/Pelvic-Reference-Data/CBCT/BuHui/01/20.dcm' pixel_array, rows, columns, slice_location = read_dicom_data(dcm_path) plt.subplot(131) plt.title('Yuantu') plt.imshow(pixel_array, cmap='gray') pixel_array1 = pixel_array pixel_array2 = pixel_array pixel_array1 = window('Pelvic',pixel_array1) imageData1 = (pixel_array1 - pixel_array1.min()) * 255.0 / (pixel_array1.max() - pixel_array1.min()) imageData1 = np.uint8(imageData1) plt.subplot(132) plt.title('window1') plt.imshow(imageData1, cmap='gray') pixel_array2 = window('Pelvic_scatter',pixel_array2) imageData2 = (pixel_array2 - pixel_array2.min()) * 255.0 / (pixel_array2.max() - pixel_array2.min()) imageData2 = np.uint8(imageData2) plt.subplot(133) plt.title('window2') plt.imshow(imageData2, cmap='gray') plt.show()
使用不同的窗宽出现相同的显示结果(第二幅和第三幅图),因为:
pixel_array1 = pixel_array pixel_array2 = pixel_array
在这里拷贝的时候用了浅拷贝,改变pixel_array1的窗宽时pixel_array和pixel_array2都发生了改变,所以window2是在改变了的pixel_array的基础上进行的。但我们不希望发生这种变化,我们希望window2是在原图上改变,所以,可以改为将浅拷贝改为copy浅拷贝或者深拷贝。
pixel_array1 = copy.copy(pixel_array) pixel_array2 = copy.copy(pixel_array)
-
Python普通变量赋值与列表赋值的区别
2020-09-05 20:32:03Python中普通变量赋值与列表赋值的区别 之前没太注意,在Python中,普通变量赋值,新变量与原变量改变,不会相互影响,但是在列表赋值的时候,新变量与原变量指向的是同一地址空间 举例如下: 普通变量赋值: 输出...记录一下编程过程中遇到的小bug
Python中普通变量赋值与列表赋值的区别
之前没太注意,在Python中,普通变量赋值,新变量与原变量改变,不会相互影响,但是在列表赋值的时候,新变量与原变量指向的是同一地址空间
举例如下:
普通变量赋值:
输出是:
列表赋值:
输出是: -
python中将一个列表赋值给另一个列表的问题
2021-10-31 15:43:33我需要将a列表的值赋给b列表的值,开始是这么写的: a=[1,2,3,4] b=a b.remove(2) print(a) print(b) 但是我移除b中的某个元素时,a中的元素也被移除了,输出结果为: [1, 3, 4] [1, 3, 4] 然后打印两个列表的地址... -
c++基础值列表赋值补充
2020-09-25 14:32:56除了初始化之外,这种...和初始化一样,使用大括号包围的值列表也有同样的优势。一个是防止窄化,有时可以简单的理解为防止精度降低,例如下面的代码是无法编译通过的: double pai = 3.1415926; int pi; pi = {pai}; -
python中将一个列表赋值给另一个列表
2020-10-20 18:14:34在写杨辉三角时,希望将一个列表直接赋值给另一个列表,就尝试写了一下。 list1 = ['1', '2', '3'] list2 = list1 print(list1) print(list2) 运行结果 ['1', '2', '3'] ['1', '2', '3'] 通过结果发现,可以直接... -
js给下拉列表赋值
2020-07-20 14:38:41js给下拉列表赋值 请选择 1 2 3 function onclick() { document.getElementById(“Test”).value=“2”; } -
Python中列表赋值
2019-09-02 16:05:59两种赋值方法最后的结果是不一样的 1.切片处理:把全新的列表赋予新变量了 ,新旧变量操作各不影响 语法: A = B[:] 例: Question: [MCQ] What are the final values of ‘a’ and ‘b’ in the code below? ... -
Python二维列表赋值问题
2020-03-24 21:39:33Python二维列表的赋值问题 使用该方法建立的二维列表,对a[0][0]进行赋值1,结果第一列全部被赋值为1: >>> a = [[0]*5]*5 >>> a [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, ... -
python多维列表赋值问题,深复制与浅复制
2020-07-28 11:26:33多维列表赋值时,因为创建时地址指向同一内存地址,导致改一个都变了 https://www.cnblogs.com/dfc001/p/11526151.html https://www.oschina.net/question/185041_117637 ... ... ...impo -
python 函数中的列表赋值
2019-03-24 22:42:41但是如果在函数中对传递来的列表进行赋值操作,则不会影响列表的数据。 这样一段代码 def Merge_sort(arr): arr = [4,6] arr = [6,4,8,1,4,2,7,6] Merge_sort(arr) print(arr) 其输出结果,依然是[6,4,8,1,4... -
列表赋值操作
2019-09-04 09:51:04list1 = [1,2,3,4] a,b,c,d = list1 则a = 1 b =2这种方式只有当左边的操作数个数和list1长度相同时,才可以这么做,不然报错. 我们假设我们有一个list对象List,它的长度足够长,想把它从下标i开始的k个元素赋给k个... -
[Python]解决一个列表赋值给另外一个列表,改变后者却前者也发生了改变的小方法
2021-08-21 09:01:11今天敲码过程中,突然发现一个地方的代码出来的值不是预期中的结果,具体现象如下:两个列表A=[1,2,3,4],B=[],把A赋值给B,然后再操作B里面的内容,发现B里面的内容发现变化后,A也会发生变化,应该是A给B赋值后B... -
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2020-12-23 20:16:34列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print b [1, 2, 3] >>> a[0] = 0 >>> print b [0, 2, 3] 解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变 如果希望b不改变,... -
datagridview中的下拉列表赋值
2008-11-26 14:17:07关于给datagridview中的下拉列表赋值,主要用到的2个参数就是 displaymember(相当于text) 和 valuemember(相当于value)。 用的是vs2008,如果解决方案打不开可以直接看代码,就几行代码,很容易看懂呵呵。 -
C# ListBox列表赋值的两种方式
2019-08-08 21:34:57C# ListBox列表赋值 C#中ListBox控件常用来显示列表信息,如显示指定文件夹下所有文件的路径等。 ListBox控件绑定数据的两种方式: 方式一:为ListBox控件逐一添加数据项 DirectoryInfo dir = new DirectoryInfo... -
python列表赋值
2020-12-06 14:44:43记录一下Python列表赋值踩过的坑 最近在做计算方法大作业,其中在三次样条插值的算法实现中,输入列表x_i直接复制给了x,但之后出现奇异现象:函数中没有对x_i的改变,为什么x_i无缘无故更改呢? 原来,python中的... -
Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解
2019-06-04 11:51:21Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等... -
【Python】将原列表赋值给一个新变量,原变量变化,新变量也变化
2021-03-18 20:00:24今天在写python程序的时候,偶然发现将原列表赋值给一个新变量,原列表变化,新变量也变化。不知道我这个发现是否正确,在此请教各位大佬。 s = [[1,2]] result = s for i in range(2): s.append(list(map(int,... -
python创建列表并给列表赋初始值的方法
2020-09-21 20:49:46主要介绍了python创建列表并给列表赋初始值的方法,涉及Python列表的定义与赋值技巧,需要的朋友可以参考下 -
一个列表赋值给两个列表变量后,其中一个列表元素改变,另一个也会改变(浅拷贝)
2020-10-26 11:36:27微信小程序,使用 setData 给两个列表变量赋值同一个数据时,当其中一个列表变量发生改变,另外一个变量也会随之改变,例如 wx.request({ url: app.url + 'api/getSelect', header: { 'Content-Type': '... -
C++11新特性(13)- 使用大括号包围的值列表赋值
2018-04-24 19:11:36C++11新特性(2)- 列表初始化除了初始化之外,这种形式也可以用于赋值语句中。先回顾一下初始化变量时的情况:vector<int> vi{1, 2, 3, 4, 5};接下来是赋值的情况:vector<int> vi;vi ... -
python循环中对一个列表的赋值问题
2020-12-22 01:04:22参考:https://www.cnblogs.com/zf-blog/p/10613981.htmlhttps://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsgpython的赋值方式是...如下图示: 不同于c的赋值方式:先为变量分配内存,然... -
layui Ajax请求给下拉框赋值的实例
2020-12-11 13:26:10如下所示: <!DOCTYPE html> <html> <head> <title>排课设置<...content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">...link rel="stylesheet -
Python-列表赋值
2018-04-04 17:08:51cars = ['bmw', 'audi', 'benz', 'ford', 'jaguar'...# 赋值全部 other_cars = cars print(other_cars) # 赋值部分 other_cars = cars[0:2] print(other_cars) 输出 ['bmw', 'audi', 'benz', 'ford', 'jaguar'...