GVKun编程网logo

python中的string和int的内部比较(python中int与string之间如何转化)

33

在本文中,我们将带你了解python中的string和int的内部比较在这篇文章中,我们将为您详细介绍python中的string和int的内部比较的方方面面,并解答python中int与string

在本文中,我们将带你了解python中的string和int的内部比较在这篇文章中,我们将为您详细介绍python中的string和int的内部比较的方方面面,并解答python中int与string之间如何转化常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的.net – 通过Microsoft.Scripting和IronPython运行Python、etree.tostring()xml python中的pretty_print、iphone – NSString stringWithUTF8String中的内存泄漏、java string中的比较难注意细节(intern,subString和gc回收String)

本文目录一览:

python中的string和int的内部比较(python中int与string之间如何转化)

python中的string和int的内部比较(python中int与string之间如何转化)

当将一个字符串与一个整数进行比较时,该字符串和int会在内部与ASCII码进行比较,还是怎么回事?我知道字符串比较大于整数,但是内部比较是如何发生的呢?

>>> "a" > 1True

答案1

小编典典

在您的示例中,1 < "a"因为for的“ i”int按字母顺序在for的“ s”之前string

从文档:

不同类型的对象(不同的数字类型和不同的字符串类型除外)绝不会相等。这样的对象被一致但任意地排序(以便对异构数组进行排序会产生一致的结果)。

我相信这是python 3改变的事情之一(您会在TypeError这里得到)。


至于在CPython中是如何完成的,除了数字以外,其他类型的对象均按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。 请注意,这是 实现
的一部分,而不是语言的一部分。

.net – 通过Microsoft.Scripting和IronPython运行Python

.net – 通过Microsoft.Scripting和IronPython运行Python

我能够创建 Python脚本并通过Visual Studio / .NET 4.0动态运行它们,如下所示:

# testScript.py file:
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7.1\Lib')
import os
os.environ['HTTP_PROXY'] = "127.0.0.1:8888"
import urllib2
response = urllib2.urlopen("http://www.google.com")

然后在.NET 4.0 WinForms项目中:

ScriptEngine engine = Python.CreateEngine();
ScriptSource script = engine.CreateScriptSourceFromFile("testScript.py");
ScriptScope scope = engine.CreateScope();
script.Execute(scope);

但是,我导入的IronPython DLL不包含所有标准模块,所以我必须这样做

import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7.1\Lib')

步骤,以便我可以运行接下来的4行.

有什么方法可以避免这种情况吗?

我将发布应用程序,我不想依赖于每个人的机器上的文件路径相同!

解决方法

有一种扩展方法,允许您直接执行此操作:

ScriptEngine engine = Python.CreateEngine();
ScriptSource script = engine.CreateScriptSourceFromFile("testScript.py");
ScriptScope scope = engine.CreateScope();

engine.SetSearchPaths(new string[] { "C:\\Program Files (x86)\\IronPython 2.7.1\\Lib" });
script.Execute(scope);

最好将stdlib与您的应用程序一起包含在私有目录中,而不是依赖于它的安装,但这取决于您.

etree.tostring()xml python中的pretty_print

etree.tostring()xml python中的pretty_print

我正在尝试使用pretty_print选项打印出xml doc.但这是一个错误

TypeError:tostring()得到一个意外的关键字参数’pretty_print’

我在这里错过了什么吗?

def CreateXML2():
    Date = etree.Element("Date",value=time.strftime(time_format,time.localtime()));
    UserNode = etree.SubElement(Date,"User");
    IDNode = etree.SubElement(UserNode,"ID");
    print(etree.tostring(Date,pretty_print=True));
似乎问题是ElementTree库不支持漂亮的打印.解决方法,正如 here所解释的那样,是从另一个库中的ElementTree重新解析输出字符串,该库提供了对漂亮打印的支持.

iphone – NSString stringWithUTF8String中的内存泄漏

iphone – NSString stringWithUTF8String中的内存泄漏

我正在打电话给数据库.在我打电话之后,我发现了Nsstring中的泄漏.任何人都有解决方案来删除它?

Nsstring *pic = [Nsstring stringWithUTF8String:(char *)sqlite3_column_text(selectStatement,5)];

在上面的代码中,我发现90%的泄漏.我只是从数据库中读取数据.

解决方法

请详细解释这个问题,否则其他人无法确定您的确切问题.

我想你是在分配[Nsstring stringWithUTF8String:(char *)sqlite3_column_text(selectStatement,5)]的值;到您的类对象属性.

您可以在相应的类dealloc方法中释放指定的类字符串属性.也可以将其设置为nil.

例:

如果你在做

YourClass *classObj =[ YourClass  alloc] init];

classObj.myStringvariable = [Nsstring stringWithUTF8String:(char *)sqlite3_column_text(selectStatement,5)];

类结构会喜欢

@interface YourClass {

    Nsstring *myStringvariable ;

}

@property (nonatomic,retain)  Nsstring *myStringvariable ;

.m文件将

@synthesise myStringvariable ;


-(void)init{

 myStringvariable  = @"";

}

-(void)dealloc{

 [myStringvariable  release];
 myStringvariable  = nil;
}

检查一下..这个结构不会显示内存泄漏.

java string中的比较难注意细节(intern,subString和gc回收String)

java string中的比较难注意细节(intern,subString和gc回收String)

    jdk1.6后对字符串常量池做了改动,从源码到表现都做了很多改动。都是在规避了OOM的问题。下面说一些改动细节以及一些常见的错误认识。

subString的变动

1.6的实现如下

    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > count) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        if (beginIndex > endIndex) {
            throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
        }
        return ((beginIndex == 0) && (endIndex == count)) ? this :
            new String(offset + beginIndex, endIndex - beginIndex, value);
    }

        这段代码逻辑没有问题,但是最后一句话改良了。问题出在这个String的构造方法上。

    String(int offset, int count, char value[]) {
        this.value = value;
        this.offset = offset;
        this.count = count;
    }

        这里直接把偏移量,长度和char数组都记录下来。当这执行subString的字符串被GC时,此时的char[]就内存泄露了。因为char数组多余的部分本来应该被回收的。

1.7直接使用了其他构造方法

    public String substring(int beginIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        int subLen = value.length - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
    }

调用下面的构造方法

    public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }

直接调用下面这个构造方法,直接执行了拷贝操作,虽然多了一部操作,同时也消除了内存泄露的问题。

    这个点是从葛一鸣老师的书中看到的。很符合这个专题,详细的还请看老师的书。

intern的变动

    具体的我原来在博客中写了,可以看

String的1.7变动:https://my.oschina.net/xpbob/blog/751405

String的1.6的表现以及场景问题:https://my.oschina.net/xpbob/blog/746488

    主要变动就是字符串常量池的位置发生了改变,由方法区转化到了堆中。intern返回的是堆中的第一次出现且intern的字符串的String对象。

    intern的操作最后参考SymbolTable.cpp中的intern方法,1.6和1.7都是这个。

String的gc

    这个细节是上intern的变动发现的。

    最开始我的理解是字符串常量基本不会被回收,只会随着类的回收而回收。事实情况不是这样的。

	public static void main(String[] args) {
		show();
		System.gc();
		show();

	}
	
	public static void show(){
		String s =new String(new char[]{''a'',''b''});
		System.out.println(System.identityHashCode(s));
		System.out.println(System.identityHashCode(s.intern()));
	}

    上面这段代码最好在jdk1.7以上执行,效果比较明显,你会发现,show方法中字符串ab和常量池中的ab的地址是一样的(这里说object是hashcode基本等同于地址,虽然事实并不是,只是和重写的hash来做区分),如果没有执行gc,那么结果都是常量池中的ab总会和第一次新建的ab的地址保持一致。

    最开始我以为是gc的时候from到to区域,所以地址变了,仔细调试看了唯一Id发现不是。

    intern的字符串被gc掉了。因为最初网上有用Intern来把字符串放入常量池来减少保证地址比较相同的做法。这个做法没什么问题。只是如果要保存地址值来做标识,那就会出问题了。

    回收的代码,1.6和1.7也是有点不同的。

    1.6的代码在SymbolTable.hpp中的unlink方法。

    1.7的代码在SymbolTable.cpp中的unlink方法。

    都是在gc执行的时候操作。只要没有堆栈对这个string持有引用,就可以被回收,这样就避免了太多的字符串加入到常量池中,把常量池所在的区域给oom了。

 

 

今天关于python中的string和int的内部比较python中int与string之间如何转化的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net – 通过Microsoft.Scripting和IronPython运行Python、etree.tostring()xml python中的pretty_print、iphone – NSString stringWithUTF8String中的内存泄漏、java string中的比较难注意细节(intern,subString和gc回收String)的相关知识,请在本站搜索。

本文标签: