繁体   English   中英

等同于Perl参考的Python

[英]Python equivalent for perl references

我是python初学者,到目前为止,我已经读过python没有引用,如果为true,那么在python中跟随以下perl代码等效于什么?

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @grps = qw/grp1:1:2:3 grp2:1:2:3 grp3:1:2:3/;

# CREATES AN ARRAY OF REFERENCES TO ARRAYS - AoR2A
my @agrps;
foreach (@grps){
  push @agrps, [split(":")];
}

# CREATES AN HASH OF REFERENCES TO ARRAYS (REFERENCES ARE THE SAME AS THEY ARE IN AoR2A ABOVE)
my %hgrps;
foreach (@agrps){
   $hgrps{"$_->[0]"} = $_;
}

# THE ELEMENTS CAN BE THEN ACCESSED EITHER VIA ARRAY OR HASH SYNTAX
$hgrps{"grp3"}->[3] = "NEW VALUE 3rd INDEX";
$agrps[2]->[2] = "NEW VALUE 2nd INDEX";

print Dumper @agrps;
print "\n";
print Dumper %hgrps;

上面脚本的输出如下:

$VAR1 = [
          'grp1',
          '1',
          '2',
          '3'
        ];
$VAR2 = [
          'grp2',
          '1',
          '2',
          '3'
        ];
$VAR3 = [
          'grp3',
          '1',
          'NEW VALUE 2nd INDEX',
          'NEW VALUE 3rd INDEX'
        ];

$VAR1 = 'grp3';
$VAR2 = [
          'grp3',
          '1',
          'NEW VALUE 2nd INDEX',
          'NEW VALUE 3rd INDEX'
        ];
$VAR3 = 'grp1';
$VAR4 = [
          'grp1',
          '1',
          '2',
          '3'
        ];
$VAR5 = 'grp2';
$VAR6 = [
          'grp2',
          '1',
          '2',
          '3'
        ];

Perl需要引用有两个原因:

  1. 以向后兼容的方式处理复杂的(即嵌套的)数据结构。 例如, $hash{entry} = @array必须继续为该条目分配数组大小,因此使用数组引用可以避免使用嵌套数据结构: $hash{entry} = \\@array

    在Python中不存在此问题。 数组和其他数据结构已经是引用类型,而不是值类型。

  2. 间接。 例如在Perl中,我们可以

     my $x = 1; my $ref = \\$x; $$ref = 42; # ($x == 42) is true 

    使用数组可以在某种程度上伪造它,重要的是不要使用值类型。 例如,我们需要两个级别才能通过引用更改某些值。

     x = [1] ref = [x] ref[0][0] = 42 # (x is [42]) is True 

    如果我们只需要一个可以引用不同事物的指针,则只需要一个级别。

    如果使用Ref类,则可能更易读:

     class Ref(object): def __init__(self, val): self.val = val ref = Ref(1) ref.val = 42 

由于您的问题集中在嵌套数据结构上,因此将代码转换为Python不需要任何“数组引用”。 普通列表即可。

grps = [...]
argps = list()
hrgps = dict()
for entry in grps:
    fields = entry.split(":") # split returns a list
    argps.append(fields)
    hrgps[fields[0]] = fields

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM