Python 在C中,相邻的两个方括号做什么
在C中,相邻的两个方括号做了什么,和python中的一样吗 在python中是这样的Python 在C中,相邻的两个方括号做什么,python,c,Python,C,在C中,相邻的两个方括号做了什么,和python中的一样吗 在python中是这样的 lst = [1,2,3,[1,2,3]] lst[3][1] 第二行将给出2 在C中,它的功能相同吗?在C中,您可以创建数组。一维或多维数组… 看看 在python中,它将是lst=[1,2,3,[1,2,3]]lst[3][1],第二个列表中将是2。在C中,它的功能相同吗 是和否。更像是不是和是真的: C数组文字与Python完全不同,它们没有括号,并且是静态类型 但是,假设lst是一个数组数组,lst
lst = [1,2,3,[1,2,3]]
lst[3][1]
第二行将给出2
在C中,它的功能相同吗?在C中,您可以创建数组。一维或多维数组…
看看 在python中,它将是lst=[1,2,3,[1,2,3]]lst[3][1],第二个列表中将是2。在C中,它的功能相同吗 是和否。更像是不是和是真的:
- C数组文字与Python完全不同,它们没有括号,并且是静态类型
- 但是,假设
是一个数组数组,lst
确实会返回第四个数组的第二个元素lst[3][1]
- C中索引的语义与Python中的非常不同(而且更容易出错)
- 事实上,C数组的语义通常与Python列表的语义非常非常不同,假设它们的工作方式类似是非常危险的
如果你必须使用C语言,你真的应该学习C语言,而不仅仅是试图通过半随机等价来蒙混过关。C不是一种大型语言,但它既不容易也不容易理解。C不支持与python相同的列表。可以认为类似于python列表的类型可能是
union
的数组。但是它是由C程序员来实现的
在C中,表达式E1[
E2]
相当于*(
E1+
E2)
。这意味着表达式E1+
E2必须产生一个可以取消引用的有效指针值
按照惯例,E1将采用数组第一个元素的地址值,E2将是数组的索引。在大多数表达式中,数组对象将采用其第一个元素的地址值
C不像python那样支持列表。可以认为类似于python列表的C数据结构类型可以是
struct
的数组,其中struct
包含一个union
来表示可以存储的各种不同类型的值。这是必需的,因为C中的数组被定义为相同类型元素的连续集合。因此,由C程序员来实现一个可以存储多种类型的类型,这是通过联合实现的
只是简单但丑陋的东西:
#define MKLIST(...) { __VA_ARGS__, { LET_None } }
#define MKLIST_int(X) { LET_int, { .v_int = (X) } }
//...
#define MKLIST_List(X) { LET_List, { .v_list = (X) } }
enum ListElementType {
LET_None,
LET_int,
//...
LET_List,
};
struct ListElement {
enum ListElementType type;
union {
int v_int;
//...
struct ListElement *v_list;
} value;
};
然后呢,
struct ListElement sublist[] =
MKLIST(MKLIST_int(1), MKLIST_int(2), MKLIST_int(3));
struct ListElement list[] =
MKLIST(MKLIST_int(1), MKLIST_int(2), MKLIST_int(3),
MKLIST_List(sublist));
printf("%d\n", List_getint(List_getlist(list, 3), 1));
虽然您可以看到您可以使用它来存储各种值,但是您不能像在python中那样自然地检索它们,因为您必须测试元素是否是您希望检索的类型
int
List_getint (struct ListElement *x, int i) {
assert(x[i].type == LET_int);
return x[i].value.v_int;
}
struct ListElement *
List_getlist (struct ListElement *x, int i) {
assert(x[i].type == LET_List);
return x[i].value.v_list;
}
然后呢,
struct ListElement sublist[] =
MKLIST(MKLIST_int(1), MKLIST_int(2), MKLIST_int(3));
struct ListElement list[] =
MKLIST(MKLIST_int(1), MKLIST_int(2), MKLIST_int(3),
MKLIST_List(sublist));
printf("%d\n", List_getint(List_getlist(list, 3), 1));
在python中也可以做同样的事情,那不是一个实际的多维数组,它只是嵌套数组。在C语言中,你没有python那样的“列表”,而是数组。数组是一个同质容器,所有元素必须是同一类型。Python中的列表是异构的,可以包含元素和元素类型的混合。更不用说初始化Python列表和C数组的语法是非常不同的。最后,C数组(不能作为一个整体)不能被分配。在C++中,使用<代码> STD::任何< /COD>支持Python列表的概念是更容易和更自然的。