Python 在C中,相邻的两个方括号做什么

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

在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[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列表的概念是更容易和更自然的。