GVKun编程网logo

Python:Python列表是否保留len()的计数,还是对每次调用计数?(python列表只保留数字)

15

在本文中,我们将带你了解Python:Python列表是否保留len在这篇文章中,我们将为您详细介绍Python:Python列表是否保留len的方方面面,并解答的计数,还是对每次调用计数?常见的疑惑

在本文中,我们将带你了解Python:Python列表是否保留len在这篇文章中,我们将为您详细介绍Python:Python列表是否保留len的方方面面,并解答的计数,还是对每次调用计数?常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的boost :: python:Python列表到std :: vector、python – 与变量不同的计数列表/元组元素?、python – 了解类变量的引用计数、Python 全栈开发:python列表List

本文目录一览:

Python:Python列表是否保留len()的计数,还是对每次调用计数?(python列表只保留数字)

Python:Python列表是否保留len()的计数,还是对每次调用计数?(python列表只保留数字)

如果我在很长的列表上继续调用len(),那是我在浪费时间,还是在后台保持int计数?

答案1

小编典典

不用担心:当然,它可以节省计数,因此len()在列表中是一项非常便宜的操作。顺便说一句,字符串,字典和集合也是如此!

boost :: python:Python列表到std :: vector

boost :: python:Python列表到std :: vector

最后,我可以使用[]运算符在python中使用std :: vector。诀窍是在boost C ++包装器中简单提供一个容器来处理内部向量:

#include <boost/python.hpp>#include <vector>class world{    std::vector<double> myvec;    void add(double n)    {        this->myvec.push_back(n);    }    std::vector<double> show()    {     return this->myvec;    }};BOOST_PYTHON_MODULE(hello){    class_<std::vector<double> >("double_vector")        .def(vector_indexing_suite<std::vector<double> >())    ;    class_<World>("World")     .def("show", &World::show)        .def("add", &World::add)    ; }

另一个挑战是:如何将python列表转换为std :: vectors?我试图添加一个期望将std :: vector作为参数的c
++类,并添加了相应的包装器代码:

#include <boost/python.hpp>#include <vector>class world{    std::vector<double> myvec;    void add(double n)    {        this->myvec.push_back(n);    }    void massadd(std::vector<double> ns)    {        // Append ns to this->myvec    }    std::vector<double> show()    {     return this->myvec;    }};BOOST_PYTHON_MODULE(hello){    class_<std::vector<double> >("double_vector")        .def(vector_indexing_suite<std::vector<double> >())    ;    class_<World>("World")     .def("show", &World::show)        .def("add", &World::add)        .def("massadd", &World::massadd)    ; }

但是,如果这样做,我将得到以下Boost.Python.ArgumentError:

>>> w.massadd([2.0,3.0])Traceback (most recent call last):  File "<stdin>", line 1, in <module>Boost.Python.ArgumentError: Python argument types in    World.massadd(World, list)did not match C++ signature:    massadd(World {lvalue}, std::vector<double, std::allocator<double> >)

谁能告诉我如何在c ++函数中访问python列表?

谢谢,丹尼尔

答案1

小编典典

为了使您的C ++方法接受Python列表,您应该使用 boost::python::list

void massadd(boost::python::list& ns){    for (int i = 0; i < len(ns); ++i)    {        add(boost::python::extract<double>(ns[i]));    }}

python – 与变量不同的计数列表/元组元素?

python – 与变量不同的计数列表/元组元素?

我有列表或/和元组:

MyVar = [0,1,0]

我想要计算与0不同的元素.

怎么做?

解决方法

您可以对条件生成器表达式进行求和,该表达式不需要任何中间列表或不必要的算术运算:

>>> sum(1 for element in MyVar if element != 0)
1

或者如@ Jean-FrançoisFabre所指出的那样:

>>> sum(1 for element in MyVar if element)
1

如果MyVar仅包含数字,则计算非零值的数量.

python – 了解类变量的引用计数

python – 了解类变量的引用计数

这是为了更好地理解引用计数在Python中的工作原理.

让我们创建一个类并实例化它.实例的引用计数为1(getrefcount显示2,因为它自己的内部结构引用该类实例将引用计数增加1):

>>> from sys import getrefcount as grc
>>> class A():
    def __init__(self):
        self.x = 100000


>>> a = A()
>>> grc(a)
2

a的内部变量x有2个引用:

>>> grc(a.x)
3

我希望它由a和_的__init__方法引用.然后我决定检查一下.

所以我在__main__命名空间中创建了一个临时变量b,以便能够访问变量x.它将ref-number增加1,使其变为3(如预期的那样):

>>> b = a.x
>>> grc(a.x)
4

然后我删除了类实例,引用计数减少了1:

>>> del a
>>> grc(b)
3

所以现在有2个引用:一个是b,一个是A(正如我所料).

通过从__main__命名空间中删除A,我希望计数再次减少1.

>>> del A
>>> grc(b)
3

但它不会发生.没有类A或其实例可以引用100000,但它仍然被__main__名称空间中的b以外的引用引用.

所以,我的问题是,除了b之外,100000引用了什么?

BrenBarn建议我应该使用object()而不是可以存储在内部某处的数字.

>>> class A():
    def __init__(self):
        self.x = object()


>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2

在删除实例a之后,b只有一个引用是非常合乎逻辑的.

唯一需要理解的是为什么数字100000不是这样的.

最佳答案
a.x是整数10000.此常量由对应于A的__init __()方法的代码对象引用.代码对象始终包含对代码中所有文字常量的引用:

>>> def f(): return 10000
>>> f.__code__.co_consts
(None,10000)

这条线

del A

只删除名称A并减少A的引用计数.在Python 3.x中(但不在2.x中),类通常包含一些循环引用,因此只有在显式运行垃圾收集器时才会收集垃圾.事实上,使用

import gc
gc.collect()

在del A之后确实导致b的引用计数减少.

Python 全栈开发:python列表List

Python 全栈开发:python列表List

列表

列表是python中经常使用的数据类型,用于存放多个值。

表现形式:在[ ]内用逗号分隔,可以存放n个任意类型的值

eg:

#单一类型
users=[''yangli'',''yite'',''fixd'']
#多类型,列表嵌套
users=[''room01'',[''yangli'',20,''音乐''],[''yite'',20,''篮球''],]

 

列表常用方法 和 函数

方法

函数

 

常用的操作

eg:

len(list)
#len(list) 计算列表的长度
ls = [''a'',''b'',''c'',''d'']
length = len(ls)
print(length)
#结果:4
append()
#append() 追加
ls = [''a'',''b'',''c'',''d'']
ls.append(''x'')
print(ls)
#结果:[''a'', ''b'', ''c'', ''d'', ''x'']
#append 将元素添加到列表的末尾
inser(index,obj)
#inser(index,obj) 插入: index插入列表的起始索引(必须指定),obj插入的元素
ls = [''a'',''b'',''c'',''d'']
ls.insert(0,''x'')        #在头部插入
print(ls)               #结果:[''x'', ''a'', ''b'', ''c'', ''d'']

ls = [''a'',''b'',''c'',''d'']
ls.insert(len(ls),''x'')  #在尾部插入
print(ls)               #结果:[''a'', ''b'', ''c'', ''d'', ''x'']

ls = [''a'',''b'',''c'',''d'']
ls.insert(2,''x'')        #在原列表索引为2的元素前 插入obj
print(ls)               #结果:[''a'', ''b'', ''x'', ''c'', ''d'']
remove()
#remove()  移除列表中某个值的第一个匹配项,无返回值
ls = [''a'',''b'',''c'',''d'']
ls.remove(''c'')          #删除c
print(ls)               #结果:[''a'', ''b'', ''d'']
pop(index)
#pop(index)  移除列表中某个值的第一个匹配项,无返回值
ls = [''a'',''b'',''c'',''d'']
res = ls.pop()          #默认删除最后一个元素
print(ls)               #结果:[''a'', ''b'', ''c'']
print(res)              #结果:d     pop()返回删除的元素

ls = [''a'',''b'',''c'',''d'']
res = ls.pop(2)         #默认删除最后一个元素
print(ls)               #结果:[''a'', ''b'', ''d'']
print(res)              #结果:c     pop()返回删除的元素
reverse() 
#reverse()              #反转列表元素
ls = [''a'',''b'',''c'',''d'']
ls.reverse()
print(ls)               #[''d'', ''c'', ''b'', ''a'']

 

 

列表的操作符

 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

# + *
ls1 = [''a'',2,''c'']
ls2 = [1,''y'',''z'']
ls3 = ls1 + ls2
print(ls3)            #结果:[''a'', 2, ''c'', 1, ''y'', ''z'']
print(ls1*3)          #结果:[''a'', 2, ''c'', ''a'', 2, ''c'', ''a'', 2, ''c'']

 

in  类似字符串中  in 的使用

#in                   #判断元素是否存在列表中
ls = [''a'',''b'',''c'',''d'']
print(''c'' in ls)      #True
print(''x'' in ls)      #False

 

列表的比较(前提条件:必须是同类型才能进行比较,否则报错

 

# 大前提:只能同类型直接比较大小,对于有索引值直接的比较是按照位置一一对应进行比较的
ls1 = [''a'',''b'',''c'']
ls2 = [''x'',''y'',''z'']
ls3 = [''A'',''Z'']
print(ls1 > ls2)        #结果:False
print(ls1 > ls3)        #结果:True

 

待补充...

 

列表的切片

关于列表的切片操作,在这里不在赘述,请参考字符串的切片。

Python 全栈开发:python字符串切片

 

 

列表的读取

ls = [''a'',''b'',''c'',''d'']
#依赖索引
i=0
while i < len(ls):        #while循环
    print(ls[i])
    i+=1

for i in range(len(ls)):    #for循环
    print(i, ls[i])

# 不依赖索引
for item  in ls:        #for循环
    print(item)

 

我们今天的关于Python:Python列表是否保留len的计数,还是对每次调用计数?的分享已经告一段落,感谢您的关注,如果您想了解更多关于boost :: python:Python列表到std :: vector、python – 与变量不同的计数列表/元组元素?、python – 了解类变量的引用计数、Python 全栈开发:python列表List的相关信息,请在本站查询。

本文标签: